import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns

sns.set(style="white", font_scale=1.5)
plt.rcParams['font.sans-serif'] = "Simsun"  # 支持中文字体
# Excel文件路径
excel_file = 'D:\\文档\\DLMU\\实验结果.xlsx'

# 使用pandas读取Excel文件
xls = pd.ExcelFile(excel_file)
dfs = []

# 读取所有工作表的数据
for sheetName in xls.sheet_names:
    df = pd.read_excel(excel_file, sheet_name=sheetName)
    df = df.dropna(subset=['平均数'])  # 删除平均数为NaN的行
    dfs.append(df)

data = pd.concat(dfs)
grouped = data.groupby('步长因子')

# 提取不同步长因子的平均目标函数值
step_factors = grouped['目标函数'].mean()


# 计算标准差作为误差
errors = grouped['目标函数'].std().values * 0.2

categories = step_factors.index.astype(str)
values = step_factors.values


positions = np.arange(len(categories))

width = 0.5  # 设置柱子的宽度

# 绘制柱状图
plt.figure(figsize=(10, 6))
# for i in range(len(categories)):
plt.bar(positions[0], values[0], width=width, yerr=errors[0], capsize=5, color='#193e8f')
plt.bar(positions[1], values[1], width=width, yerr=errors[1], capsize=5, color='#55b7e6')
plt.bar(positions[2], values[2], width=width, yerr=errors[2], capsize=5, color='#004080')
plt.bar(positions[3], values[3], width=width, yerr=errors[3], capsize=5, color='#FD9F02')
plt.bar(positions[4], values[4], width=width, yerr=errors[4], capsize=5, color='#A0A0A4')
plt.bar(positions[5], values[5], width=width, yerr=errors[5], capsize=5, color='#e53528')

# 添加图表标签
plt.ylabel('平均目标函数值')
plt.xlabel('步长因子')
plt.title('不同步长因子下的平均目标函数值')

# 设置x轴刻度标签
plt.xticks(positions, categories)

# 设置y轴范围，从2800开始
plt.ylim(2800, 3300)

# 显示图表
plt.tight_layout()
plt.grid(False)
plt.show()
